from typing import Optional

from fastapi import APIRouter, Depends
from pydantic import BaseModel
from sqlalchemy import text
from sqlalchemy.orm import Session

from dbs.databases import scp_session
from dbs.models import Item

import logging

logger = logging.getLogger(__name__)
# 这个tags只是一个名字，辅助说明一下。prefix才是路由前缀
router = APIRouter(tags=["role"])


# 定义输入的请求参数
class Role(BaseModel):
    name: str  # 必选 名字
    weight: Optional[str] = None  # 可选参数
    age: int  # 必选参数
    length: Optional[str] = None  # 可选参数


# 依赖项：为每个请求提供一个数据库会话
def get_db():
    db = scp_session()
    try:
        yield db
    finally:
        db.close()


@router.get('/role-list')
def role_list(db: Session = Depends(get_db)):
    item = Item()
    item.id = 1
    item.name = "尹雷"
    item.descriptions = "牛比啊"
    db.add(item)
    db.commit()

    # 新增多条数据
    # datas = [
    #     User(name='张三', age=20),
    #     User(name='李四', age=21),
    #     User(name='王五', age=22),
    # ]
    # session.add_all(datas)

    query_item = db.get(Item, 1)
    logger.info(query_item.name)

    # 这个model可以返回，就是必填项，要使用构造函数，因为他要验证
    role = Role(name='yinlei', age=18)
    # return {'name': 'yinlei', 'age': 18}
    return role


@router.post('/query-list')
def query_list(role: Role, session: Session = Depends(get_db)):

    # 查询所有
    item_list = session.query(Item).all()
    logger.info(len(item_list))

    # 分页过滤
    limit_list = session.query(Item).limit(10).all()

    # 定义你的 SQL 查询语句
    sql_query = text("SELECT * FROM items WHERE name = :value")

    # 使用 $session$ 执行 SQL，并传入参数。result是一个游标
    result = session.execute(sql_query, {"value": "尹雷"})
    # session.scalar(sql_query, {"value": "尹雷"})  # 返回单个值

    # 获取查询结果，这里假设查询结果为多条记录。row是一个元组
    for row in result:
        logger.info(row)

    # 查询名字为 "尹雷" 的用户
    yin = session.query(Item).filter_by(name='尹雷').first()

    reply = Role(name='查询成功', age=18)
    return reply


@router.post('/update')
def role_update(role: Role, session: Session = Depends(get_db)):
    # 方法一
    # 查询名字为 "尹雷" 的用户. 然后更新，update的默认参数是values，也可以使用命名参数
    # .update(values={'descriptions': 'update'})
    yin = session.query(Item).filter_by(name='尹雷').update({'descriptions': 'update'})
    session.commit()

    # 方法二：
    # yin = session.query(Item).filter_by(name='尹雷').first()
    # yin.descriptions = "update info"
    # session.commit()  # 这样也能更新数据，同一个session范围内

    result = Role(name='查询成功', age=18)
    return result


@router.post('/delete')
def delete_role(role: Role, session: Session = Depends(get_db)):
    # 这两种删除都可以，filter和filter_by
    # del_count = session.query(Item).filter(Item.id==1).delete()
    del_count = session.query(Item).filter_by(id=1).delete()
    logger.info('删除数目: %d', del_count)
    session.commit()
